package schema

import (
	"errors"
	"strings"
)

// Park 园区管理
type Park struct {
	ID           int64   `json:"id" bson:"_id" structs:"id"`                                 // 唯一标识(自增ID)
	RecordID     string  `json:"record_id" bson:"record_id" structs:"record_id"`             // 记录内码(uuid)
	Name         string  `json:"name" bson:"name" structs:"name"`                            // 建筑名称
	Type         int     `json:"type" bson:"type" structs:"type"`                            // 园区类型（10:园区 20:区域 30:楼栋 40:单元 50:楼层 60门牌）
	SalesStatus  int     `json:"sales_status" bson:"sales_status" structs:"sales_status"`    // 销售状态(10:物业自用 20:物业自持 30:已售 40:待售)
	LeaseStatus  int     `json:"lease_status" bson:"lease_status" structs:"lease_status"`    // 租赁状态(10:已出租 20:待出租)
	BuildingArea float64 `json:"building_area" bson:"building_area" structs:"building_area"` // 建筑面积
	UsedArea     float64 `json:"used_area" bson:"used_area" structs:"used_area"`             // 使用面积
	LevelCode    string  `json:"level_code" bson:"level_code" structs:"level_code"`          // 分级码
	ParentID     string  `json:"parent_id" bson:"parent_id" structs:"parent_id"`             // 父级内码
	Creator      string  `json:"creator" bson:"creator" structs:"creator"`                   // 创建人
	Created      int64   `json:"created" bson:"created" structs:"created"`                   // 创建时间戳
	Deleted      int64   `json:"deleted" bson:"deleted" structs:"deleted"`                   // 删除时间戳
}

//	Park 门牌(或者房间)划分三类:不租不售、租赁(已租、未租)、销售(已售、未售)

// Validate 验证参数
func (a *Park) Validate() error {
	if a.Name == "" || strings.Count(a.Name, "")-1 > 20 {
		return errors.New("无效的请求参数")
	}

	checklease := func() error {
		switch a.LeaseStatus {
		case 10:
		case 20:
		default:
			return errors.New("租赁状态异常")
		}
		return nil
	}

	checksales := func() error {
		switch a.SalesStatus {
		case 10:
		case 20:
			if e := checklease(); e != nil {
				return e
			}
		case 30:
		case 40:
		default:
			return errors.New("销售状态异常")
		}
		return nil
	}

	switch a.Type {
	case 10:
	case 20:
	case 30:
		if e := checksales(); e != nil {
			return e
		}
	case 40:
		if e := checksales(); e != nil {
			return e
		}
	case 50:
		if e := checksales(); e != nil {
			return e
		}
	case 60:
		if e := checksales(); e != nil {
			return e
		}
	default:
		return errors.New("无效类别")
	}
	return nil
}

// ParkQueryParam 菜单查询参数
type ParkQueryParam struct {
	Name        string // 名称
	Type        int    // 园区类型（10:园区 20:区域 30:楼栋 40:单元 50:楼层 60门牌）
	SalesStatus int    // 销售状态(10:物业自用 20:物业自持 30:已售 40:待售)
	LeaseStatus int    // 租赁状态(10:已出租 20:待出租)
	ParentID    string // 父级内码
}

// ParkSelectParam 菜单选择数据查询参数
type ParkSelectParam struct {
	Name        string // 名称
	Type        int    // 园区类型（10:园区 20:区域 30:楼栋 40:单元 50:楼层 60门牌）
	SalesStatus int    // 销售状态(10:物业自用 20:物业自持 30:已售 40:待售)
	LeaseStatus int    // 租赁状态(10:已出租 20:待出租)
	ParentID    string // 父级内码
	Search      string // 检索参数
}

// ParkSelect 菜单选择数据
type ParkSelect struct {
	RecordID     string  `json:"record_id" bson:"record_id" structs:"record_id"`             // 记录内码(uuid)
	Name         string  `json:"name" bson:"name" structs:"name"`                            // 名称
	ParentID     string  `json:"parent_id" bson:"parent_id" structs:"parent_id"`             // 父级内码
	Type         int     `json:"type" bson:"type" structs:"type"`                            // 园区类型（10:园区 20:区域 30:楼栋 40:单元 50:楼层 60门牌）
	SalesStatus  int     `json:"sales_status" bson:"sales_status" structs:"sales_status"`    // 销售状态(10:物业自用 20:物业自持 30:已售 40:待售)
	LeaseStatus  int     `json:"lease_status" bson:"lease_status" structs:"lease_status"`    // 租赁状态(10:已出租 20:待出租)
	BuildingArea float64 `json:"building_area" bson:"building_area" structs:"building_area"` // 建筑面积
	UsedArea     float64 `json:"used_area" bson:"used_area" structs:"used_area"`             // 使用面积
	LevelCode    string  `json:"level_code" bson:"level_code" structs:"level_code"`          // 分级码
}
